package at.dl.android.dota.adviser;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Based on a reigndesign blog, 
 * see http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
 * for further information
 */
public class DataBaseHelper extends SQLiteOpenHelper {

    private static String DB_PATH = "/data/data/at.dl.android.dota.adviser/databases/";
    private static String DB_NAME = "dota_base.db";
    private static int DB_VERSION = 1;

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    public DataBaseHelper ( Context context ) {
        super(context,DB_NAME,null,DB_VERSION);
        this.myContext = context;
    }

    public void createDataBase () throws IOException {

        boolean dbExist = checkDataBase();

        if ( dbExist ) {
            // do nothing - database already exist
        } else {
            // By calling this method and empty database will be created into
            // the default system path
            // of your application so we are gonna be able to overwrite that
            // database with our database.
            getReadableDatabase();

            try {
                copyDataBase();
            } catch ( IOException e ) {
                throw new RuntimeException("Error copying database",e);
            }
        }

    }

    private boolean checkDataBase () {
        return false;
        // TODO: find a proper way to copy db if and only if changed!
        /*
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY);

        } catch ( SQLiteException e ) {
            // database does't exist yet.
            return false;
        }

        if ( checkDB != null ) {
            checkDB.close();
            return true;
        }
        return false;
        */
    }

    private void copyDataBase () throws IOException {
        // Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        // transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ( (length = myInput.read(buffer)) > 0 ) {
            myOutput.write(buffer,0,length);
        }

        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }
    
    public void openDataBase() throws SQLException {
        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    }

    public SQLiteDatabase getDataBase () {
        return myDataBase;
    }

    @Override
    public synchronized void close () {
        if ( myDataBase != null )
            myDataBase.close();
        super.close();
    }

    @Override
    public void onCreate ( SQLiteDatabase db ) {
    }

    @Override
    public void onUpgrade ( SQLiteDatabase db, int oldVersion, int newVersion ) {
    } 

}
